home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / rjs.lha / RJS / Transport / src / UnixSocket.C < prev   
C/C++ Source or Header  |  1991-06-14  |  2KB  |  105 lines

  1. #include "Transport.h"
  2.  
  3. #include <stdio.h>
  4. #include <osfcn.h>
  5. #include <libc.h>
  6. #include <string.h>
  7. //#include <iostream.h>
  8.  
  9. #include <RJS/Util.h>
  10.  
  11. int RJS_UnixSocket::active(const RJS_UnixAddress &ua)
  12. {
  13.  
  14.   sex=Active;
  15.   if (inuse()) close();
  16.   if (!socket() || !connect(ua,ua.addrlen)) {
  17.     if (return_on_error) return 0;
  18.     RJS_Util::crash_and_burn("RJS_UnixSocket","active",sys_errlist[errno]);
  19.   } else {
  20.     ss_set(SS_success); 
  21.     return 1;
  22.   }
  23. }
  24.  
  25. int RJS_UnixSocket::passive(const RJS_UnixAddress &ua)
  26. {
  27.  
  28.   sex=Passive;   
  29.   if (inuse()) close();
  30.   if (!socket() || !bind(ua,ua.addrlen)|| !listen(SOMAXCONN)) {
  31.     if (return_on_error) return 0;
  32.     RJS_Util::crash_and_burn("RJS_UnixSocket","open",sys_errlist[errno]);
  33.   } else {
  34.     unlink_socket=1;
  35.     filename=ua.pathname();
  36.     ss_set(SS_success); 
  37.     return 1;
  38.   }
  39. }
  40.  
  41. RJS_UnixSocket::~RJS_UnixSocket() 
  42. {
  43.   if (inuse()) close();
  44. }
  45.  
  46. int RJS_UnixSocket::close() 
  47. {
  48.  
  49.   if (    unlink_socket) {
  50.     unlink(filename);
  51.   }
  52.  
  53.   int s = ::close(td);
  54.   if (s==-1) {
  55.     ss_set(RJS_Status(errno));
  56.     if (return_on_error) return 0;
  57.     RJS_Util::crash_and_burn("RJS_UnixSocket","close",ss_message());
  58.   }
  59.  
  60.   ss_set(SS_success); 
  61.   td = -1;
  62.   return 1;
  63. }
  64.  
  65. int RJS_UnixSocket::accept(RJS_UnixSocket &newsocket)
  66. {
  67.     if (!ok() || !is_passive()) {
  68.         newsocket.td     = -1;
  69.         newsocket.ss_set(SS_error);
  70.         return 0;
  71.     }
  72.  
  73.     if (newsocket.inuse()) newsocket.close();
  74.  
  75.     newsocket = *this;
  76.     RJS_UnixAddress remote;
  77.     remote.addrlen=remote.size();
  78.         newsocket.td = RJS_Socket::accept(remote,remote.addrlen);
  79.  
  80.     if (newsocket.td < 0 ) {
  81.         ss_set(RJS_Status(errno));
  82.         if (return_on_error) return 0;
  83.         RJS_Util::crash_and_burn("RJS_UnixSocket","accept",ss_message());
  84.     } else {
  85.         ss_set(SS_success);
  86.         return 1;
  87.     }
  88. }
  89.  
  90.  
  91. int RJS_UnixSocket::getpeername(RJS_UnixAddress &ua)
  92. {
  93.     ua.addrlen=ua.size();
  94.     int stat=RJS_Socket::getpeername(ua,ua.addrlen);
  95.     return stat;
  96. }
  97.  
  98. int RJS_UnixSocket::getsockname(RJS_UnixAddress &ua)
  99. {
  100.     ua.addrlen=ua.size();
  101.     int stat=RJS_Socket::getsockname(ua,ua.addrlen);
  102.     return stat;
  103. }
  104.  
  105.